;fr Strongarm

	GET	riscos/asm_dec.s

 	AREA |C$$code|, CODE, READONLY

 	EXPORT |FIX_FLOAT_MEM_SL|
 	EXPORT |FIXCEIL_FLOAT_MEM_SL|
 	EXPORT |FLOAT_FIX_MEM|
 	EXPORT |FLOAT_COPY|
 	EXPORT |FLOAT_SL|
 	EXPORT |FLOAT_NEG|
 	EXPORT |FLOAT_ABS|
 	EXPORT |FLOAT_SQRT|
 	EXPORT |CMP_FLOAT_MEM|
 	EXPORT |ADD_FLOAT_MEM|
 	EXPORT |SUB_FLOAT_MEM|
 	EXPORT |MUL_FLOAT_MEM|
 	EXPORT |DIV_FLOAT_MEM|
 	EXPORT |LMUL|
 	EXPORT |FDIV|
 	EXPORT |FDIVS|
 	EXPORT |FDIV64|
 	EXPORT |ADotProduct|
 	EXPORT |AVectorCopy|

	MACRO
	DOUBLESPLIT $r0,$r1

	mov $r1,$r1,lsr#22
	add $r1,$r1,$r0,lsl#10
	orr $r1,$r1,#&40000000
	bic $r1,$r1,#&80000000
	mov $r0,$r0,lsr#20
	tst $r0,#&800
	rsbne $r1,$r1,#0
        bics $r0,$r0,#&800
        moveq $r1,#0

        MEND


        MACRO
        DOUBLEJOIN $r0,$r1         ;wenn r1 Null ist muss auch r0 Null sein!

        cmp $r1,#&80000000
        moveq $r1,$r1,asr#1
        addeq $r0,$r0,#1
        mov $r0,$r0,lsl#20
        tst $r1,#&80000000
        orrne $r0,$r0,#&80000000
        rsbne $r1,$r1,#0
        bic $r1,$r1,#&40000000
        orr $r0,$r0,$r1,lsr#10
        mov $r1,$r1,lsl#22

        MEND


	MACRO
	FLOATSPLIT $r0,$r1

	mov $r1,$r0,lsl#7
	orr $r1,$r1,#&40000000
	bic $r1,$r1,#&80000000
	mov $r0,$r0,lsr#23
	tst $r0,#&100
	rsbne $r1,$r1,#0
        bics $r0,$r0,#&100
        moveq $r1,#0

        MEND


;wenn r1 Null ist muss auch r0 Null sein!
        MACRO
        FLOATJOIN $r0,$r1

        cmp $r1,#&80000000
        moveq $r1,$r1,asr#1
        addeq $r0,$r0,#1
        mov $r0,$r0,lsl#23
        tst $r1,#&80000000
        orrne $r0,$r0,#&80000000
        rsbne $r1,$r1,#0
        bic $r1,$r1,#&40000000
        orr $r0,$r0,$r1,lsr#7

        MEND

;------------------------------------------------------------------------------

; e1,m1,e2,m2,tmp
; Ergebnis in e1,m1
	MACRO
        MUL_SPLITTED $r1,$r2,$r3,$r4,$r5
	eor $r5,$r2,$r4		;bit 31 gesetzt -> Ergebnis negativ!
	add $r1,$r1,$r3
	sub $r1,$r1,#127	;r1=ergebnisexponent (Exponenten wie float)

	tst $r2,#&80000000
	rsbne $r2,$r2,#0
	mov $r2,$r2,lsl#1
	tst $r4,#&80000000
	rsbne $r4,$r4,#0
	mov $r4,$r4,lsl#1

	umulls $r3,$r2,$r4,$r2
	movmi $r2,$r2,lsr#1
	addmi $r1,$r1,#1
	moveq $r1,#0

        tst $r5,#&80000000
        rsbne $r2,$r2,#0

        MEND

;------------------------------------------------------------------------------

	MACRO
	ADD_SPLITTED $r1,$r2,$r3,$r4,$t1,$t2,$n,$nn,$rdy

	eor $t2,$r2,$r4           ;bit 31 gesetzt -> ne Differenz, Normieren!

	subs $t1,$r1,$r3
	movlt $r1,$r3             ;r1=ergebnisexponent
	movge $r4,$r4,asr $t1
	rsblt $t1,$t1,#0
	movlt $r2,$r2,asr $t1

	adds $r2,$r2,$r4
	movvs $r2,$r2,rrx
	addvs $r1,$r1,#1
	moveq $r1,#0
	tstne $t2,#&80000000
	beq $rdy

	ands $t2,$r2,#&80000000
	rsbne $r2,$r2,#0

	cmp $r2,#&00400000
	movle $r2,$r2,asl#8
	suble $r1,$r1,#8
	cmp $r2,#&00400000
	movle $r2,$r2,asl#8
	suble $r1,$r1,#8

	cmp $r2,#&40000000
	bge $nn

$n
	mov $r2,$r2,asl#1
	sub $r1,$r1,#1
	cmp $r2,#&40000000
	blt $n

$nn
	tst $t2,#&80000000
	rsbne $r2,$r2,#0
$rdy
	cmp $r2,#&80000000
        moveq $r2,$r2,asr#1
        addeq $r1,$r1,#1

	MEND

;******************************************************************************
;int CMP_FLOAT_MEM(float *a, float *b);
	NAME CMP_FLOAT_MEM

|CMP_FLOAT_MEM|

	stmfd r13!,{r14}

	ldr r3,[r1]
	ldr r1,[r0]

	FLOATSPLIT r1, r2	;r1=expo1 r2=mantisse 1
	FLOATSPLIT r3, r14	;r3=expo1 r14=mantisse 1

	mov r0,r2,lsr#31
	cmp r0,r14,lsr#31
	beq fcmpm_se

	movgt r0,#-1
	movlt r0,#1
 [ {CONFIG}=26
	ldmfd r13!,{pc}^
 |
	ldmfd r13!,{pc}
 ]

fcmpm_se
	cmp r1,r3
	beq fcmpm_mantisse
	movlt r0,#-1
	movgt r0,#1
	tst r2,#&80000000
	rsbne r0,r0,#0
 [ {CONFIG}=26
	ldmfd r13!,{pc}^
 |
	ldmfd r13!,{pc}
 ]

fcmpm_mantisse
	cmp r2,r14
	movlt r0,#-1
	moveq r0,#0
	movgt r0,#1
 [ {CONFIG}=26
	ldmfd r13!,{pc}^
 |
	ldmfd r13!,{pc}
 ]

;******************************************************************************
	NAME FIX_FLOAT_MEM_SL

|FIX_FLOAT_MEM_SL|
	ldr r0,[r0]
 	mov r2,r0,lsr#23
 	bic r2,r2,#&100
 	rsb r2,r2,#128+29
 	subs r2,r2,r1
 	blt ffixms_overflow
 	cmp r2,#30
 	bgt ffixms_zero

 	mov r1,r0,lsl#7
 	orr r1,r1,#&40000000
 	bic r1,r1,#&80000000
 	tst r0,#&80000000
 	rsbne r1,r1,#0

 	mov r0,r1,asr r2

	RETURN
; 	movs pc,r14

ffixms_overflow
	tst r0,#&80000000
	mov r0,#&80000000
	subeq r0,r0,#1

	RETURN
;	movs pc,r14

ffixms_zero
	mov r0,#0
	RETURN
;	movs pc,r14

;******************************************************************************
	NAME FIXCEIL_FLOAT_MEM_SL

|FIXCEIL_FLOAT_MEM_SL|
	ldr r0,[r0]
	movs r2,r0,lsl#1
	beq ffixcms_zero
 	mov r2,r0,lsr#23
 	bic r2,r2,#&100
 	rsbs r2,r2,#128+29
 	subs r2,r2,r1
 	blt ffixcms_overflow

 	mov r1,r0,lsl#7
 	orr r1,r1,#&40000000
 	bic r1,r1,#&80000000
 	tst r0,#&80000000
 	rsbne r1,r1,#0

 	mov r0,r1,asr r2
 	cmp r1,r0,asl r2
 	addne r0,r0,#1
	RETURN
; 	movs pc,r14

ffixcms_overflow
	tst r0,#&80000000
	mov r0,#&80000000
	subeq r0,r0,#1
	RETURN
;	movs pc,r14

ffixcms_zero
	mov r0,#0
	RETURN
;	movs pc,r14

;******************************************************************************
;ADD_FLOAT_MEM(&p, &a, &b);
	NAME ADD_FLOAT_MEM

|ADD_FLOAT_MEM|

	stmfd r13!,{r4,r14}

	ldr r1,[r1]
	ldr r3,[r2]

	FLOATSPLIT r1, r2	;r1=expo1 r2=mantisse 1
	FLOATSPLIT r3, r4	;r3=expo1 r4=mantisse 1

	eor r14,r2,r4           ;bit 31 gesetzt -> ne Differenz, Normieren!

	subs r12,r1,r3
	movlt r1,r3             ;r1=ergebnisexponent
	movge r4,r4,asr r12
	rsblt r12,r12,#0
	movlt r2,r2,asr r12

	adds r2,r2,r4
	movvs r2,r2,rrx
	addvs r1,r1,#1
	moveq r1,#0
	tstne r14,#&80000000
	beq faddm_join

	ands r14,r2,#&80000000
	rsbne r2,r2,#0

	cmp r2,#&00400000
	movle r2,r2,asl#8
	suble r1,r1,#8
	cmp r2,#&00400000
	movle r2,r2,asl#8
	suble r1,r1,#8

	cmp r2,#&40000000
	bge faddm_nixnorm

faddm_norm
	mov r2,r2,asl#1
	sub r1,r1,#1
	cmp r2,#&40000000
	blt faddm_norm

faddm_nixnorm
	tst r14,#&80000000
	rsbne r2,r2,#0
	cmp r1,#0
	blt faddm_zero
faddm_join
	FLOATJOIN r1, r2

	str r1,[r0]

 [ {CONFIG}=26
	ldmfd r13!,{r4, pc}^
 |
	ldmfd r13!,{r4, pc}
 ]

faddm_zero
	mov r1,#0
	str r1,[r0]
 [ {CONFIG}=26
	ldmfd r13!,{r4, pc}^
 |
	ldmfd r13!,{r4, pc}
 ]
;	ldmfd r13!,{r4,pc}^


;******************************************************************************
;SUB_FLOAT_MEM(&p, &a, &b);
	NAME SUB_FLOAT_MEM

|SUB_FLOAT_MEM|
	stmfd r13!,{r4,r14}

	ldr r1,[r1]
	ldr r3,[r2]

	FLOATSPLIT r1, r2	;r1=expo1 r2=mantisse 1
	FLOATSPLIT r3, r4	;r3=expo1 r4=mantisse 1
	rsb r4,r4,#0

	eor r14,r2,r4           ;bit 31 gesetzt -> ne Differenz, Normieren!

	subs r12,r1,r3
	movlt r1,r3             ;r1=ergebnisexponent
	movge r4,r4,asr r12
	rsblt r12,r12,#0
	movlt r2,r2,asr r12

	adds r2,r2,r4
	movvs r2,r2,rrx
	addvs r1,r1,#1
	moveq r1,#0
	tstne r14,#&80000000
	beq fsubm_join

	ands r14,r2,#&80000000
	rsbne r2,r2,#0

	cmp r2,#&00400000
	movle r2,r2,asl#8
	suble r1,r1,#8
	cmp r2,#&00400000
	movle r2,r2,asl#8
	suble r1,r1,#8

	cmp r2,#&40000000
	bge fsubm_nixnorm

fsubm_norm
	mov r2,r2,asl#1
	sub r1,r1,#1
	cmp r2,#&40000000
	blt fsubm_norm

fsubm_nixnorm
	tst r14,#&80000000
	rsbne r2,r2,#0
	cmp r1,#0
	blt fsubm_zero
fsubm_join
	FLOATJOIN r1, r2

	str r1,[r0]

 [ {CONFIG}=26
	ldmfd r13!,{r4, pc}^
 |
	ldmfd r13!,{r4, pc}
 ]
;	ldmfd r13!,{r4,pc}^

fsubm_zero
	mov r1,#0
	str r1,[r0]
 [ {CONFIG}=26
	ldmfd r13!,{r4, pc}^
 |
	ldmfd r13!,{r4, pc}
 ]
;	ldmfd r13!,{r4,pc}^


;******************************************************************************
;MUL_FLOAT_MEM(&p, &a, &b);
	NAME MUL_FLOAT_MEM

|MUL_FLOAT_MEM|
	stmfd r13!,{r14}

	ldr r1,[r1]
	ldr r3,[r2]

	FLOATSPLIT r1, r2	;r1=expo1 r2=mantisse 1
	FLOATSPLIT r3, r12	;r3=expo1 r12=mantisse 1

	eor r14,r2,r12           ;bit 31 gesetzt -> Ergebnis negativ!
	add r1,r1,r3
	subs r1,r1,#127          ;r1=ergebnisexponent
	blt fmulm_zero

	tst r2,#&80000000
	rsbne r2,r2,#0
	mov r2,r2,lsl#1
	tst r12,#&80000000
	rsbne r12,r12,#0
	mov r12,r12,lsl#1

	umulls r3,r2,r12,r2
	movmi r2,r2,lsr#1
	addmi r1,r1,#1
	moveq r1,#0

        tst r14,#&80000000
        rsbne r2,r2,#0

	FLOATJOIN r1, r2

	str r1,[r0]

 [ {CONFIG}=26
	ldmfd r13!,{pc}^
 |
	ldmfd r13!,{pc}
 ]
;	ldmfd r13!,{pc}^

fmulm_zero
	mov r1,#0
	str r1,[r0]
 [ {CONFIG}=26
	ldmfd r13!,{pc}^
 |
	ldmfd r13!,{pc}
 ]
;	ldmfd r13!,{pc}^

;******************************************************************************
;DIV_FLOAT_MEM(&p, &a, &b);
	NAME DIV_FLOAT_MEM

|DIV_FLOAT_MEM|
	stmfd r13!,{r4,r14}

	mov r3,r0

	ldr r12,[r1]
	ldr r0,[r2]

	FLOATSPLIT r12, r1	;r12=expo1 r1=mantisse 1
	FLOATSPLIT r0, r2	;r0=expo1 r2=mantisse 1

	eor r4,r1,r2            ;bit 31 gesetzt -> Ergebnis negativ!
	sub r12,r12,r0
	adds r12,r12,#127       ;r1=ergebnisexponent
	blt fdivm_zero

	tst r1,#&80000000
	rsbne r1,r1,#0
	tst r2,#&80000000
	rsbne r2,r2,#0

	mov r0,r1,lsl#30
	mov r1,r1,lsr#2
	bl |FDIV64|
	cmp r0,#&40000000
	movlt r0,r0,lsl#1
	sublt r12,r12,#1
	cmp r0,#0
	moveq r12,#0

        tst r4,#&80000000
        rsbne r0,r0,#0

	FLOATJOIN r12, r0

	str r12,[r3]

 [ {CONFIG}=26
	ldmfd r13!,{r4, pc}^
 |
	ldmfd r13!,{r4, pc}
 ]
;	ldmfd r13!,{r4,pc}^

fdivm_zero
	mov r12,#0
	str r12,[r3]
 [ {CONFIG}=26
	ldmfd r13!,{r4, pc}^
 |
	ldmfd r13!,{r4, pc}
 ]
;	ldmfd r13!,{r4,pc}^


;******************************************************************************
;int FLOAT_FIX_MEM(i, &f);
	NAME FLOAT_FIX_MEM

|FLOAT_FIX_MEM|

	cmp r0,#0
	beq ffm_null

 	mov r2,#157

 	ands r3,r0,#&80000000
 	rsbne r0,r0,#0

 	cmp r0,#&00400000
 	sublt r2,r2,#8
 	movlt r0,r0,asl#8
 	cmp r0,#&00400000
 	suble r2,r2,#8
 	movle r0,r0,asl#8
 	cmp r0,#&00400000
 	suble r2,r2,#8
 	movle r0,r0,asl#8

	cmp r0,#&40000000
	bge ffm_nixnorm

ffm_norm
	mov r0,r0,asl#1
	sub r2,r2,#1
	cmp r0,#&40000000
	movlt r0,r0,asl#1
	sublt r2,r2,#1
	cmplt r0,#&40000000
	blt ffm_norm

ffm_nixnorm
        cmp r3,#0
        rsbne r0,r0,#0
	FLOATJOIN r2, r0

	str r2,[r1]

	RETURN
;	movs pc,r14

ffm_null
	mov r0,#0
	str r0,[r1]
	RETURN
;	movs pc,r14


;******************************************************************************
;void FLOAT_SQRT(&d, &s)
;r4=a
;r5=h
;r14=z

|FLOAT_SQRT|

	stmfd r13!,{r4-r6,r14}

	mov r12,r0	;zielpointer sichern

	ldr r3,[r1]
	FLOATSPLIT r3, r4	;r3=exponent, r4=mantisse
	sub r3,r3,#127

	tst r3,#1
	bne sqt_2

sqt_1
	sub r5,r4,#&40000000	;h=a-0x40000000
	mov r6,#&40000000	;z=0x40000000+(h>>1)
	add r6,r6,r5,lsr#1	;Anfangsnherung

	cmp r5,#&b5000
	bcc sqt_12end

	mov r0,#0		;z=(z+FDIV64(0,a>>2,z))>>1
	mov r1,r4,lsr#2
	mov r2,r6
	bl |FDIV64|
	add r6,r6,r0
	mov r6,r6,lsr#1		;1. Rekursion fertig

	cmp r5,#&3600000
	bcc sqt_12end

	mov r0,#0		;z=(z+FDIV64(0,a>>2,z))>>1
	mov r1,r4,lsr#2
	mov r2,r6
	bl |FDIV64|
	add r6,r6,r0
	mov r6,r6,lsr#1		;2. Rekursion fertig

	cmp r5,#&24000000
	bcc sqt_12end

	mov r0,#0		;z=(z+FDIV64(0,a>>2,z))>>1
	mov r1,r4,lsr#2
	mov r2,r6
	bl |FDIV64|
	add r6,r6,r0
	mov r6,r6,lsr#1		;3. Rekursion fertig

	b sqt_12end

sqt_2
	rsb r5,r4,#&80000000	;h=0x80000000-a
	mov r4,r4,lsl#1		;a=(a<<1)
	mov r6,#&40000000	;z=0x40000000+(a>>2)
	add r6,r6,r4,lsr#2	;Anfangsnherung

	cmp r5,#&100000
	bcc sqt_12end

	mov r0,#0		;z=(z+FDIV64(0,a>>2,z))>>1
	mov r1,r4,lsr#2
	mov r2,r6
	bl |FDIV64|
	add r6,r6,r0
	mov r6,r6,lsr#1		;1. Rekursion fertig

	cmp r5,#&5900000
	bcc sqt_12end

	mov r0,#0		;z=(z+FDIV64(0,a>>2,z))>>1
	mov r1,r4,lsr#2
	mov r2,r6
	bl |FDIV64|
	add r6,r6,r0
	mov r6,r6,lsr#1		;2. Rekursion fertig

	cmp r5,#&2d000000
	bcc sqt_12end

	mov r0,#0		;z=(z+FDIV64(0,a>>2,z))>>1
	mov r1,r4,lsr#2
	mov r2,r6
	bl |FDIV64|
	add r6,r6,r0
	mov r6,r6,lsr#1		;3. Rekursion fertig

sqt_12end
	mov r3,r3,asr#1
	add r3,r3,#127

	FLOATJOIN r3, r6
	str r3,[r12]

 [ {CONFIG}=26
	ldmfd r13!,{r4-r6, pc}^
 |
	ldmfd r13!,{r4-r6, pc}
 ]
;	ldmfd r13!,{r4-r6,pc}^

;******************************************************************************
;void FLOAT_COPY(&d, &s);
	NAME FLOAT_COPY

|FLOAT_COPY|

	ldr r2,[r1]
	str r2,[r0]
	RETURN
;	movs pc,r14

;******************************************************************************
;void FLOAT_SL(&d, &s, int shift);
	NAME FLOAT_SL

|FLOAT_SL|

	ldr r1,[r1]
	FLOATSPLIT r1, r3	;r1=expo r3=mantisse
	adds r1,r1,r2
	movlt r1,#0
	FLOATJOIN r1, r3
	str r1,[r0]
	RETURN
;	movs pc,r14

;******************************************************************************
;void FLOAT_NEG(&d, &s);
	NAME FLOAT_NEG

|FLOAT_NEG|

	ldr r2,[r1]
	cmp r2,#0
	eorne r2,r2,#&80000000
	str r2,[r0]
	RETURN
;	movs pc,r14

;******************************************************************************
;void FLOAT_ABS(&d, &s);
	NAME FLOAT_ABS

|FLOAT_ABS|

	ldr r2,[r1]
	bic r2,r2,#&80000000
	str r2,[r0]
	RETURN
;	movs pc,r14

;******************************************************************************
;void ADotProduct(&d, &a, &b);
	NAME ADotProduct

|ADotProduct|
	stmfd r13!,{r4-r8,r14}

	ldr r3,[r1]
	ldr r5,[r2]
	FLOATSPLIT r3, r4	;r3(e),r4(m) = a[0]
	FLOATSPLIT r5, r6	;r5(e),r6(m) = b[0]
	MUL_SPLITTED r3,r4,r5,r6,r14

	ldr r5,[r1,#4]
	ldr r7,[r2,#4]
	FLOATSPLIT r5, r6
	FLOATSPLIT r7, r8
	MUL_SPLITTED r5,r6,r7,r8,r14

	ADD_SPLITTED r3,r4,r5,r6,r12,r14,adp_l0,adl_l1,adl_l2

	ldr r5,[r1,#8]
	ldr r7,[r2,#8]
	FLOATSPLIT r5, r6
	FLOATSPLIT r7, r8
	MUL_SPLITTED r5,r6,r7,r8,r14

	ADD_SPLITTED r3,r4,r5,r6,r12,r14,adp_l3,adl_l4,adl_l5

	FLOATJOIN r3, r4
	str r3,[r0]

 [ {CONFIG}=26
	ldmfd r13!,{r4-r8, pc}^
 |
	ldmfd r13!,{r4-r8, pc}
 ]
;	ldmfd r13!,{r4-r8,pc}^

;******************************************************************************
;void AVectorCopy(&a, &b);
	NAME AVectorCopy

|AVectorCopy|

	ldmia r0,{r0,r2,r3}
	stmia r1,{r0,r2,r3}
	RETURN
;	movs pc,r14

;******************************************************************************
;int LMUL(int a, int b, int shift);
	NAME LMUL

|LMUL|
	smull r3,r0,r1,r0
	rsb r1,r2,#32
	mov r3,r3,lsr r2
	add r0,r3,r0,asl r1
	RETURN
;	movs pc,r14

;******************************************************************************
;int FDIVS(int a, int b);
	NAME FDIVS

|FDIVS|

	ands r3,r1,#&80000000
	rsbmi r1,r1,#0
	eor r3,r3,r0,asr#1             ;bit 31 = quotsign, bit 30 = remsign
	cmp r0,#0
	rsbmi r0,r0,#0

	mov r12,r14
	bl |FDIV|

	tst r3,#&80000000
	rsbne r0,r0,#0
	tst r3,#&40000000
	rsbne r1,r1,#0

 [ {CONFIG}=26
	movs pc,r12
 |
	mov pc, r12
 ]

;******************************************************************************
;int FDIV(int a, int b);
	NAME FDIV

|FDIV|

	cmp r1,#1
	beq uo
	mov r2,#0
	cmp r1,r0,lsr#15
	bhi l0_15
;16_31
	cmp r1,r0,lsr#23
	bhi l16_23
;24_31
	cmp r1,r0,lsr#27
	bhi l24_27
;28_31
	cmp r1,r0,lsr#29
	bhi l28_29
;30_31
	cmp r1,r0,lsr#30
	bhi u30
	b u31
l28_29
	cmp r1,r0,lsr#28
	bhi u28
	b u29

l24_27
	cmp r1,r0,lsr#25
	bhi l24_25
;26_27
	cmp r1,r0,lsr#26
	bhi u26
	b u27
l24_25
	cmp r1,r0,lsr#24
	bhi u24
	b u25

l16_23
	cmp r1,r0,lsr#19
	bhi l16_19
;20_23
	cmp r1,r0,lsr#21
	bhi l20_21
;22_23
	cmp r1,r0,lsr#22
	bhi u22
	b u23
l20_21
	cmp r1,r0,lsr#20
	bhi u20
	b u21

l16_19
	cmp r1,r0,lsr#17
	bhi l16_17
;l18_19
	cmp r1,r0,lsr#18
	bhi u18
	b u19
l16_17
	cmp r1,r0,lsr#16
	bhi u16
	b u17

l0_15
	cmp r1,r0,lsr#7
	bhi l0_7
;8_15
	cmp r1,r0,lsr#11
	bhi l8_11
;12_15
	cmp r1,r0,lsr#13
	bhi l12_13
;14_15
	cmp r1,r0,lsr#14
	bhi u14
	b u15
l12_13
	cmp r1,r0,lsr#12
	bhi u12
	b u13

l8_11
	cmp r1,r0,lsr#9
	bhi l8_9
;10_11
	cmp r1,r0,lsr#10
	bhi u10
	b u11
l8_9
	cmp r1,r0,lsr#8
	bhi u8
	b u9

l0_7
	cmp r1,r0,lsr#3
	bhi l0_3
;4_7
	cmp r1,r0,lsr#5
	bhi l4_5
;6_7
	cmp r1,r0,lsr#6
	bhi u6
	b u7
l4_5
	cmp r1,r0,lsr#4
	bhi u4
	b u5

l0_3
	cmp r1,r0,lsr#1
	bhi l0_1
;2_3
	cmp r1,r0,lsr#2
	bhi u2
	b u3
l0_1
	cmp r1,r0
	bhi u0
	b u1

u31
	cmp r0,r1,lsl#30
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#30
u30
	cmp r0,r1,lsl#29
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#29
u29
	cmp r0,r1,lsl#28
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#28
u28
	cmp r0,r1,lsl#27
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#27
u27
	cmp r0,r1,lsl#26
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#26
u26
	cmp r0,r1,lsl#25
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#25
u25
	cmp r0,r1,lsl#24
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#24
u24
	cmp r0,r1,lsl#23
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#23
u23
	cmp r0,r1,lsl#22
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#22
u22
	cmp r0,r1,lsl#21
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#21
u21
	cmp r0,r1,lsl#20
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#20
u20
	cmp r0,r1,lsl#19
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#19
u19
	cmp r0,r1,lsl#18
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#18
u18
	cmp r0,r1,lsl#17
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#17
u17
	cmp r0,r1,lsl#16
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#16
u16
	cmp r0,r1,lsl#15
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#15
u15
	cmp r0,r1,lsl#14
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#14
u14
	cmp r0,r1,lsl#13
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#13
u13
	cmp r0,r1,lsl#12
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#12
u12
	cmp r0,r1,lsl#11
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#11
u11
	cmp r0,r1,lsl#10
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#10
u10
	cmp r0,r1,lsl#9
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#9
u9
	cmp r0,r1,lsl#8
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#8
u8
	cmp r0,r1,lsl#7
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#7
u7
	cmp r0,r1,lsl#6
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#6
u6
	cmp r0,r1,lsl#5
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#5
u5
	cmp r0,r1,lsl#4
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#4
u4
	cmp r0,r1,lsl#3
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#3
u3
	cmp r0,r1,lsl#2
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#2
u2
	cmp r0,r1,lsl#1
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#1
u1
	cmp r0,r1,lsl#0
	adc r2,r2,r2
	subcs r0,r0,r1,lsl#0
u0

	mov r1,r0
	mov r0,r2
	RETURN
;  movs pc,r14

uo
	mov r1,#0
	RETURN
;	movs pc,r14


;******************************************************************************
;int FDIV64(int l, int h, int d);
	NAME FDIV64

|FDIV64|

	adds	r0,r0,r0
	adc	r1,r1,r1

	GBLA	i
i	SETA	31
	WHILE	i >0

	cmp	r1,r2		;Also die 4 Zeilen
	subcs	r1,r1,r2	;31 mal wiederholen !
	adcs	r0,r0,r0
	adc	r1,r1,r1

i	SETA	i-1
	WEND

	cmp	r1,r2
	subcs	r1,r1,r2
	adcs	r0,r0,r0

	RETURN
;	movs	pc,r14


 	END
